import { loginApi, getUserInfoAPI } from '@/api/user'
import { getToken, setToken, removeToken } from '@/utils/auth'
import { constantRoutes, resetRouter } from '@/router'
// 状态
const state = {
  token: getToken() || '',
  userInfo: {},
  routes: constantRoutes
}

// 同步任务 将token存储得到state
const mutations = {
  setRoutes(state, asyncRouter) {
    state.routes = [...constantRoutes, ...asyncRouter]
  },
  // 接到actions的通知 要改仓库中的数据
  /**
   *
   * @param {*} state 状态对象 就是仓库
   * @param {*} payload 异步任务传来的值
   */
  setUserToken(state, payload) {
    state.token = payload
  },
  setUserInfo(state, payload) {
    state.userInfo = payload
  },
  removeToken(state, payload) {
    state.token = payload
    removeToken()
  }
}

// 异步任务 发送登录请求 得到token
const actions = {
/**
 *
 * @param {*} ctx 上下文
 * @param {*} layout 传来的值
 */
  async loginAction(ctx, layout) {
    console.log(layout)
    // layout是用来接收点击登录页面后传的值 用来调接口
    // 假装接口调取成功 获取了token
    const token = await loginApi(layout)
    console.log(token)
    // 把token传给仓库 仓库只能通过mutations来操作 所以要通知mutations
    ctx.commit('setUserToken', token)
    // 本地持久化 本地存储 村的token 要先导入本地持久化函数
    setToken(token)
  },
  async getUserInfoAction(ctx) {
    const userInfo = await getUserInfoAPI()
    ctx.commit('setUserInfo', userInfo)

    return userInfo
  },
  logoutAction(ctx) {
    ctx.commit('removeToken', '')
    ctx.commit('setUserInfo', {})
    resetRouter()
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}
